package com.carwash.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ParseException;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class DeepSeekService {

    @Value("${deepseek.api.key}")
    private String apiKey;

    @Value("${deepseek.api.url}")
    private String apiUrl;

    private final ObjectMapper objectMapper;
    private final CloseableHttpClient httpClient;

    public DeepSeekService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
        this.httpClient = HttpClients.createDefault();
    }

    public String chat(String userQuestion) throws IOException, ParseException {
        // 示例问答数据
        List<Map<String, String>> qaData = new ArrayList<>();
        qaData.add(new HashMap<String, String>() {{
            put("question", "团购券怎么使用");
            put("answer",
                "第一步：扫门口小程序码。第二步：点击左下角小程序首页（不在首页点击左上角箭头返回首页）点蓝色团购核销窗口核销，复制抖音团购订单内的券码（选择相对应的门店核销）。第三步：车辆绑定输入车牌（无牌车摩托车可手动选择相应门店后点击开始洗车，注意不要选错门店不然无法开门）。第四步：车子往后倒下，再缓慢前进，自动识别开门（无牌车和摩托车忽略这步）。注：如果实在不会操作可以打门上电话，如果是30分钟套餐超时需要另外在小程序上充值50起充，如果不想充值请留意小程序上的时间。");
        }});
        qaData.add(new HashMap<String, String>() {{
            put("question", "门不开是怎么回事");
            put("answer", "a. 核销成功后门不会直接打开，需要手动选择或绑定车牌后才能开门（具体教程可以发送：如何使用）。b. 如果还不行：在小程序点击订单，订单上面有对应的门店名字看看是不是选错门店了。c. 门口的门上有电话，如果是选错门店的话拨打电话商家会重新给你补一张。d. 有啥问题可以打门上电话咨询。");
        }});
        qaData.add(new HashMap<String, String>() {{
            put("question", "客服电话");
            put("answer",
                "每个门店对应的门上或是工位上有对应的客服电话，如果实在无法解决就打电话。如果未能及时接听麻烦添加微信：sp6794。后续客服会在上面为您处理");
        }});
        qaData.add(new HashMap<String, String>() {{
            put("question", "第一次使用这个自助洗车，怎么进场");
            put("answer",
                "第一步：扫描门上二维码。第二步：选择首页充值缴费，并完成充值。第三步：回到首页选择绑定车牌（无牌车无需此操作，并参考步骤五）第四步：车子往后倒一定距离后缓慢前进，识别倒车牌后即可自动开门，如果门没关上时请勿直接入场 第五步：无牌车或摩托车扫描门上对应的“无牌车入场二维码”进入页面后手动点击开始按钮即可开门");
        }});
        qaData.add(new HashMap<String, String>() {{
            put("question", "是自动洗车的吗");
            put("answer",
                "我们这个是手动洗车的，是需要自己动手洗车的。");
        }});
        qaData.add(new HashMap<String, String>() {{
            put("question", "出不去了怎么办");
            put("answer",
                "首先确定自己有没有订单（小程序内->我的->洗车订单），里面可以看到订单，如果有订单就确保自己余额充足，如果余额不足需要充值（注意不要购买次卡套餐，否则无法离场），实在无法离场请拨打工位上的店主电话。");
        }});
        qaData.add(new HashMap<String, String>() {{
            put("question", "我想开一家洗车店，怎么加盟");
            put("answer",
                "如果您也对自助洗车店感兴趣的话，可以添加微信：18969869412，会有专业人员与您对接。");
        }});
        // 构建上下文
        StringBuilder context = new StringBuilder("你是自助洗车店的客服助手，请根据以下问答数据回答问题：\n");
        qaData.forEach(qa -> context.append("问：").append(qa.get("question")).append("\n")
            .append("答：").append(qa.get("answer")).append("\n\n"));

        // 调用DeepSeek-V3生成回答
        String response = generateResponse(context.toString(), userQuestion);
        System.out.println("回答：" + response);
        return response;
    }

    /**
     * 调用DeepSeek-V3 API生成回答
     *
     * @param context    上下文
     * @param userInput  用户提问
     * @return          生成的回答
     */
    private  String generateResponse(String context, String userInput) {
        try {
            // 创建URL对象
            URL url = new URL(apiUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法为POST
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setRequestProperty("Authorization", "Bearer " + apiKey);
            connection.setDoOutput(true);

            // 使用 org.json 构建请求体
            JSONObject requestBody = new JSONObject();
            requestBody.put("model", "deepseek-chat");
            requestBody.put("temperature", 0.1);

            JSONArray messages = new JSONArray();
            messages.put(new JSONObject().put("role", "system").put("content", context));
            messages.put(new JSONObject().put("role", "user").put("content", userInput));
            requestBody.put("messages", messages);


            // 打印请求体 JSON
            System.out.println("请求体 JSON：" + requestBody.toString());

            // 发送请求
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = requestBody.toString().getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            // 获取响应状态码
            int responseCode = connection.getResponseCode();
            if (responseCode != HttpURLConnection.HTTP_OK) {
                // 读取错误信息
                try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getErrorStream(), "utf-8"))) {
                    StringBuilder errorResponse = new StringBuilder();
                    String errorLine;
                    while ((errorLine = br.readLine()) != null) {
                        errorResponse.append(errorLine.trim());
                    }
                    System.err.println("API 请求失败，状态码：" + responseCode);
                    System.err.println("错误信息：" + errorResponse.toString());
                }
                return "请联系店主，店主微信：18969869412。";
            }

            // 获取响应
            StringBuilder response = new StringBuilder();
            try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) {
                String responseLine;
                while ((responseLine = br.readLine()) != null) {
                    response.append(responseLine.trim());
                }
            }

            // 解析响应（假设响应是一个JSON字符串，包含"choices"字段）
            String responseString = response.toString();
            log.info("API 响应：" + responseString);
            JSONObject jsonResponse = new JSONObject(responseString);
            JSONArray choices = jsonResponse.getJSONArray("choices");
            if (choices.length() > 0) {
                return choices.getJSONObject(0).getJSONObject("message").getString("content");
            } else {
                return "未收到有效回答，请联系店主微信：18969869412。";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "请联系店主，店主微信：18969869412。";
        }
    }

    /**
     * 清理输入中的控制字符
     *
     * @param input 输入字符串
     * @return 清理后的字符串
     */
    private static String sanitizeInput(String input) {
        // 移除控制字符（\u0000-\u001F），保留 \n、\t、\r
        return input.replaceAll("[\\p{Cntrl}&&[^\n\t\r]]", "");
    }
}